package cn.itsource.org.domain;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.List;

//给每一个属性，添加swaggerui的注释

/**
 *  对实体类中的Getter和setter方法，是可以进行重写的！！！
 *
 *     重写原则：
 *      getter针对的是列表查询返回的数据
 *          特点：重写了实体类中的getter方法后，返回到 前端的json数据，将会自动将每一条数据的当前get属性进行更新
 *         示例：因为前端部门列表在进行修改操作时，需要回显 级联选择器的数据，所以要修改parentIds的getter方法
 *          小结：只要是修改表格中的行数据，就重写 getter
 *
 *
 *      setter方法何时修改？ 执行节点：前端把参数传递到后台controller方法时，会执行
 *          setter一般不改
 *
 *      特殊情况：
 *          当重写了getter,但是又需要对重写了getter方法的属性进行重新赋值或者需要使用它的值时，
 *          解决：在当前实体类中，增加一个public方法，将所有需要更改的属性，统一处理
 *
 *
 *
 */


@Data
@Table(name = "t_department")
public class Department {
    @ApiModelProperty("这是主键")
    @Id
    private Long id;
    @ApiModelProperty("编号")
    private String sn;
    @ApiModelProperty("部门名称")
    private String name;

    private Long state;
    private Long managerId;
    private Long parentId;
    private String path;//保存当前部门的所有上级部门ID的 路径.保存的时候是1,2,3,4
    //由于前端使用的是级联选择，选择某一个部门后，返回的是一个数组，所以新增一个属性，来接收这个值
    private Long[] parentIds;
    //这个就是上级部门对象。根据parentId来查询
    private Department parent;
    //当前部门的所有下级
    private List<Department> children;

    //将保存在数据库的数据，转换为前端可识别的 Long[]结构
    public Long[] getParentIds() {
        if (StringUtils.isNotBlank(this.getPath())) {
            String[] split = StringUtils.split(this.path, ",");
            Long[] ll = new Long[split.length];
            for (int i = 0 ; i < split.length ; i++) {
                ll[i]=Long.parseLong(split[i]);
            }
            return ll;
        }
        return null;
    }

    /**
     * 这个方法，对凡是和重写了parentIds属性有关的其他属性，全部在这里统一处理
     */
    public void initData() {
        if (this.parentIds != null && this.parentIds.length > 0) {
            this.path = StringUtils.join(this.parentIds, ",");
            this.parentId = this.parentIds[this.parentIds.length - 1];
        }
    }
}
